package com.itheima.leetcode.od.b.dynamicprogramming;

import java.util.Arrays;

/**
 * (B卷,200分)- 跳格子2（Java & JS & Python & C）
 * <p>
 * 本题是LeetCode - 213 打家劫舍 II换皮题
 * <p>
 * 题目描述
 * <p>
 * 小明和朋友玩跳格子游戏，有 n 个连续格子组成的圆圈，每个格子有不同的分数，小朋友可以选择以任意格子起跳，但是不能跳连续的格子，不能回头跳，也不能超过一圈;
 * <p>
 * 给定一个代表每个格子得分的非负整数数组，计算能够得到的最高分数。
 * <p>
 * 输入描述
 * <p>
 * 给定一个数例，第一个格子和最后一个格子首尾相连，如: 2 3 2
 * <p>
 * 输出描述
 * <p>
 * 输出能够得到的最高分，如: 3
 * <p>
 * 备注
 * 1 ≤ nums.length ≤ 100
 * 1 ≤ nums[i] ≤ 1000
 * <p>
 * 用例
 * <p>
 * 输入	2 3 2
 * 输出	3
 * 说明	只能跳3这个格子，因为第一个格子和第三个格子首尾相连
 * <p>
 * 输入	1 2 3 1
 * 输出	4
 * 说明	1 + 3 = 4
 */
public class JumpGrid {
    public static void main() {
        String input = "2 3 2";
        int[] nums = Arrays.stream(input.split(" "))
                .mapToInt(Integer::parseInt)
                .toArray();

        System.out.println(getResult(nums));
    }

    private static int getResult(int[] nums) {
        if (1 == nums.length) {
            return nums[0];
        }
        return Math.max(rob(Arrays.copyOfRange(nums, 1, nums.length)),
                rob(Arrays.copyOfRange(nums, 0, nums.length - 1)));
    }

    public static int rob(int[] nums) {
        if (1 == nums.length) {
            return nums[0];
        }
        int[] dp = new int[nums.length];
        dp[0] = nums[0];
        dp[1] = Integer.max(nums[0], nums[1]);
        for (int i = 2; i < nums.length; i++) {
            dp[i] = Integer.max(dp[i - 1], dp[i - 2] + nums[i]);
        }
        return dp[nums.length - 1];
    }
}
